<?php

namespace app\common\logic;

use app\common\model\commonModel;
use app\common\model\trResource;
use app\common\model\trSystemSet;
use app\common\util\CosUploads;
use app\common\util\ErrorCode;
use app\common\util\Tools;
use think\facade\Env;

/**
 * Class Auth
 * @package app\admin\model
 */
class WxAppLogic
{
    //空操作
    public function _empty()
    {
        return ErrorCode::code("method_not_exist");
    }

    // 小程序模板消息 -- 订单分配通知管理员
    public static function distributionTpl($userId, $openid, $data){
//        $orderRemindTpl = trSystemSet::getValue("WxOrderRemindTpl"); // 订单分配提醒通知
//        if(!empty($orderRemindTpl["orderRemindTpl"]) && $orderRemindTpl["orderRemindTplStatus"] == "1"){ //
//            self::delExpireFormId($userId);
//            $continue = 0;
//            do {
//                $formData = commonModel::getFields(formIdTable, "form_id", ["user_id" => $userId], true, false);
//                if (!empty($formData["formId"])) {
//                    $templateData = [
//                        'keyword1' => ['value' => $data['orderSn']],                                              // 单号
//                        'keyword2' => ['value' => $data["reserveTime"]],                                          // 出车时间
//                        'keyword3' => ['value' => $data["addressFrom"]],                                          // 出发地
//                        'keyword4' => ['value' => $data["addressTo"]],                                            // 目的地
//                        'keyword5' => ['value' => $data['contactName']],                                          // 联系人
//                        'keyword6' => ['value' => $data["mobile"]],                                               // 电话
//                        'keyword7' => ['value' => "类型：{$data["typeName"]}"],                                   // 订单信息
//                    ];
//
//                    $result = self::sendTplNotice($openid, $orderRemindTpl["orderRemindTpl"], $formData["formId"], $templateData, "pages/center/index/index"); // pages/order/index/index 订单页
//                    commonModel::delByFilter(formIdTable, ["form_id" => $formData["formId"]]);
//                    if ($result['errcode'] !== 0) {
//                        $continue++;
//                    }else{
//                        return true;
//                    }
//                }
//            }while($continue < 9); // 尝试9次发送，都失败就失败了
//        }
        return false;
    }

    // 小程序模板消息 -- 未支付单
    public static function sendNoPayTpl($userId, $openid, $data){
//        $notPayTpl = trSystemSet::getValue("WxNotPayTpl");
//        if(!empty($notPayTpl["notPayTpl"]) && $notPayTpl["notPayTplStatus"] == "1"){ //
//            self::delExpireFormId($userId);
//            $continue = 0;
//            do {
//                $formData = commonModel::getFields(formIdTable, "form_id", ["user_id" => $userId], true, false);
//                if (!empty($formData["formId"])) {
//                    $templateData = [
//                        'keyword1' => ['value' => $data['orderSn']],                                                                       // 单号
//                        'keyword2' => ['value' => $data['totalMoney']],                                                                    // 金额
//                        'keyword3' => ['value' => date("Y-m-d H:i")],                                     // 下单日期
//                        'keyword4' => ['value' => "路线"],                                                                           // 物品名称
//                        'keyword5' => ['value' => $data['payMoney']],                                     // 支付金额
//                        'keyword6' => ['value' => $data["addressFrom"] . "-" . $data["addressTo"]],                                                                   // 行程
//                        'keyword7' => ['value' => $data["reserveTime"]],                                                    // 时间
//                        'keyword8' => ['value' => $data["userName"]],                                  // 乘客
//                    ];
//
//                    $result = self::sendTplNotice($openid, $notPayTpl["notPayTpl"], $formData["formId"], $templateData, "pages/order/index/index"); // pages/order/index/index 订单页
//                    commonModel::delByFilter(formIdTable, ["form_id" => $formData["formId"]]);
//                    if ($result['errcode'] !== 0) {
//                        $continue++;
//                    }else{
//                        $continue = 0;
//                    }
//                }
//            }while($continue < 9); // 尝试9次发送，都失败就失败了
//        }
        return true;
    }

    // 小程序模板消息 -- 支付单
    public static function sendPayTpl($userId, $openid, $data){
//        $payTpl = trSystemSet::getValue("WxPayTpl"); //支付通知模板消息
//        if(!empty($payTpl["payTpl"]) && $payTpl["payTplStatus"] == "1"){
//            self::delExpireFormId($userId);
//            $continue = 0;
//            do {
//                $formData = commonModel::getFields(formIdTable, "form_id", ["user_id" => $userId], true, false);
//                if (!empty($formData["formId"])) {
//                    $templateData = [
//                        'keyword1' => ['value' => $data['orderSn']],                                                                      // 单号
//                        'keyword2' => ['value' => $data['typeName']],                                                                    // 商品名称
//                        'keyword3' => ['value' => date("Y-m-d H:i", $data['payTime'])],                                         // 支付时间
//                        'keyword4' => ['value' => number_format($data['payMoney'], 2, '.', '')],    // 支付金额
//                        'keyword5' => ['value' => $data['contactName']],                                                       // 客户名称
//                        'keyword6' => ['value' => $data["reserveTime"]],                                                    // 出发时间
//                        'keyword7' => ['value' => $data["rideNumber"]],                                  // 乘车人数
//                    ];
//                    $result = self::sendTplNotice($openid, $payTpl["payTpl"], $formData["formId"], $templateData, "pages/order/index/index"); // pages/order/index/index 订单页
//                    commonModel::delByFilter(formIdTable, ["form_id" => $formData["formId"]]);
//                    if ($result['errcode'] !== 0) {
//                        $continue++;
//                    }else{
//                        $continue = 0;
//                    }
//                }
//            }while($continue < 9); // 尝试9次发送，都失败就失败了
//        }
        return true;
    }

    // 订单分配通知 - 司机
    public static function sendOrderReceiptTpl($openid, $data){
//        $receiptTpl = trSystemSet::getValue("WxReceiptTpl"); //接单通知模板消息
//        if(!empty($receiptTpl["receiptTpl"]) && $receiptTpl["receiptTplStatus"] == "1"){ // 接单通知模板消息
//            self::delExpireFormId($data["driverId"]);
//            $continue = 0;
//            do {
//                $formData = commonModel::getFields(formIdTable, "form_id", ["user_id" => $data["driverId"]], true, false);
//                if(!empty($formData["formId"])) {
//                    $data["mobilePrefix"] = substr($data["mobile"], 0, -11);
//                    $data["mobile"] = substr($data["mobile"], -11);
//                    $templateData = [
//                        'keyword1' => ['value' => $data["typeName"]],       // 服务项目
//                        'keyword2' => ['value' => $data["orderSn"]],                                // 订单号
//                        'keyword3' => ['value' => $data["addressFrom"]],                            // 始发地
//                        'keyword4' => ['value' => $data["addressTo"]],                              // 目的地
//                        'keyword5' => ['value' => $data['reserveTime']],                            // 出行时间
//                        'keyword6' => ['value' => "+".$data["mobilePrefix"] . $data["mobile"]],   // 联系电话
//                        'keyword7' => ['value' => $data["payMoney"]],                               // 订单金额
//                        'keyword8' => ['value' => $data["rideNumber"]],                             // 人数
//                        'keyword9' => ['value' => $data["memo"]],                                   // 温馨提示
//                    ];
//
//                    $result = self::sendTplNotice($openid, $receiptTpl["receiptTpl"], $formData["formId"], $templateData, "pages/driver/order/index/index"); //
//                    commonModel::delByFilter(formIdTable, ["form_id" => $formData["formId"]]);
//                    if ($result['errcode'] !== 0) {
//                        $continue++;
//                    }else{
//                        $continue = 0;
//                    }
//                }
//            }while($continue < 9); // 尝试9次发送，都失败就失败了
//        }
        return true;
    }

    // 订单退款
    public static function sendOrderRefundTpl($openid, $data){
//        $refundTpl = trSystemSet::getValue("WxRefundTpl"); // 退款通知模板消息
//        if(!empty($refundTpl["refundTpl"]) && $refundTpl["refundTplStatus"] == "1"){
//            self::delExpireFormId($data["userId"]);
//            $continue = 0;
//            do {
//                $formData = commonModel::getFields(formIdTable, "form_id", ["user_id" => $data["userId"]], true, false);
//                if(!empty($formData["formId"])) {
//                    $templateData = [
//                        'keyword1' => ['value' => $data["typeName"]],                          // 商品名称
//                        'keyword2' => ['value' => $data["orderSn"]],                           // 订单编号
//                        'keyword3' => ['value' => $data["statusText"]],                        // 退款状态
//                        'keyword4' => ['value' => $data["payMoney"]],                          // 退款金额
//                        'keyword5' => ['value' => $data['memo']],                              // 退款原因
//                        'keyword6' => ['value' => date("Y-m-d H:i:s")],               // 退款时间
//                    ];
//
//                    $result = self::sendTplNotice($openid, $refundTpl["refundTpl"], $formData["formId"], $templateData, "pages/order/index/index"); //
//                    commonModel::delByFilter(formIdTable, ["form_id" => $formData["formId"]]);
//                    if ($result['errcode'] !== 0) {
//                        $continue++;
//                    }else{
//                        $continue = 0;
//                    }
//                }
//            }while($continue < 9); // 尝试9次发送，都失败就失败了
//        }
        return true;
    }

    // 会员注册通知
    public static function sendRegisterTpl($openid, $formId, $data){
//        $registerTpl = trSystemSet::getValue("WxRegisterTpl"); // 用户注册通知模板消息
//        if(!empty($registerTpl["registerTpl"]) && $registerTpl["registerTplStatus"] == "1"){
////            $formData = commonModel::getFields(formIdTable, "form_id", ["user_id" => $data["userId"]], true, false);
//            if(!empty($formId)) {
//                $data["registerTime"] = is_numeric($data["registerTime"]) ? date("Y-m-d H:i", $data["registerTime"]) : $data["registerTime"];
//                $templateData = [
//                    'keyword1' => ['value' => $data["nickname"]],                         // 会员昵称
//                    'keyword2' => ['value' => $data["numberId"]],                         // 会员号
//                    'keyword3' => ['value' => $data["genderText"]],                       // 性别
//                    'keyword4' => ['value' => $data["mobile"]],                           // 手机
//                    'keyword5' => ['value' => $data['statusText']],                       // 用户状态
//                    'keyword6' => ['value' => $data["registerTime"]],                     // 注册时间
//                ];
//
//                $result = self::sendTplNotice($openid, $registerTpl["registerTpl"], $formId, $templateData, "pages/center/index/index"); //
////                commonModel::delByFilter(formIdTable, ["form_id" => $formData["formId"]]);
//                if ($result['errcode'] === 0) {
//                    return true;
//                } else {
//                    return false;
//                }
//            }
//        }
        return true;
    }

    // 订单取消
    public static function sendOrderCancelTpl($openid, $data){
//        $revokeTpl = trSystemSet::getValue("WxRevokeTpl"); // 订单取消通知模板消息
//        if(!empty($revokeTpl["revokeTpl"]) && $revokeTpl["revokeTplStatus"] == "1"){
//            self::delExpireFormId($data["userId"]);
//            $continue = 0;
//            do {
//                $formData = commonModel::getFields(formIdTable, "form_id", ["user_id" => $data["userId"]], true, false);
//                if(!empty($formData["formId"])) {
//                    $templateData = [
//                        'keyword1' => ['value' => $data["orderSn"]],                         // 订单编号
//                        'keyword2' => ['value' => $data["payMoney"]],                         // 订单金额
//                        'keyword3' => ['value' => $data["typeName"]],                       // 订单类型
//                        'keyword4' => ['value' => $data["reason"]],                           // 取消原因
//                        'keyword5' => ['value' => $data['memo']],                       // 备注
//                        'keyword6' => ['value' => $data["createTime"]],                     // 下单时间
//                    ];
//
//                    $result = self::sendTplNotice($openid, $revokeTpl["revokeTpl"], $formData["formId"], $templateData, "pages/order/index/index"); //
//                    commonModel::delByFilter(formIdTable, ["form_id" => $formData["formId"]]);
//                    if ($result['errcode'] !== 0) {
//                        $continue++;
//                    }else{
//                        $continue = 0;
//                    }
//                }
//            }while($continue < 9); // 尝试9次发送，都失败就失败了
//        }
        return true;
    }

    // 订单预约到期
    public static function sendOrderAppointTpl($openid, $data){
//        $appointmentExpireTpl = trSystemSet::getValue("WxAppointmentExpireTpl"); // 预约到期通知模板消息
//        if(!empty($appointmentExpireTpl["appointmentExpireTpl"]) && $appointmentExpireTpl["appointmentExpireTplStatus"] == "1"){
//            self::delExpireFormId($data["userId"]);
//            $continue = 0;
//            do {
//                $formData = commonModel::getFields(formIdTable, "form_id", ["user_id" => $data["userId"]], true, false);
//                if(!empty($formData["formId"])) {
//                    $templateData = [
//                        'keyword1' => ['value' => $data["typeName"]],                         // 预约项目
//                        'keyword2' => ['value' => "出发地：".$data["addressFrom"]],                           // 地址
//                        'keyword3' => ['value' => $data["orderSn"]],                         // 订单号
//                        'keyword4' => ['value' => $data['reserveTime']],                       // 预约时间
//                        'keyword5' => ['value' => $data["memo"]],   // 温馨提示
//                    ];
//
//                    $result = self::sendTplNotice($openid, $appointmentExpireTpl["appointmentExpireTpl"], $formData["formId"], $templateData, "pages/order/index/index"); //
////                    Tools::writeLog("订单即将过期数据：".var_export($data,1).var_export($result,1), "expire.txt");
//                    commonModel::delByFilter(formIdTable, ["form_id" => $formData["formId"]]);
//                    if ($result['errcode'] !== 0) {
//                        $continue++;
//                    }else{
//                        $continue = 0;
//                    }
//                }
//            }while($continue < 9); // 尝试9次发送，都失败就失败了
//        }
        return true;
    }

    public static function delExpireFormId($userId){
        list($y, $m, $d) = explode('-', date("Y-m-d"));
        $filter = [
            ["user_id", "=", $userId],
            ["create_time", "<", mktime(0, 0, 0, $m, $d-4, $y)],
        ];
        commonModel::delByFilter(formIdTable, $filter);
    }

    /**
     * @param bool $check
     * @return mixed
     * 获取token信息
     */
    public static function getAccessToken($check = true)
    {
        $wxAppConfig = trSystemSet::getValue("wxAppConfig");
        if($check && $token = C_get($wxAppConfig["appId"]."_access_token")) {
            return $token;
        }
        $url = "https://api.weixin.qq.com/cgi-bin/token?grant_type=client_credential&appid={$wxAppConfig["appId"]}&secret={$wxAppConfig["appSecret"]}";
        $response = Tools::curl($url);
        $result = json_decode($response, true);
        if (isset($result['errcode']) && $result['errcode'] != 0) {
            Tools::writeLog("getAccessToken报错：".var_export($result,1), "template.txt");
            return "";
        } else {
            C_set($wxAppConfig["appId"]."_access_token", $result['access_token'], $result['expires_in']);
            return $result['access_token'];
        }
    }

    // 小程序发送微信模板消息接口
    public static function sendTplNotice($openid, $template_id, $form_id, $postData = [], $page = 'index', $color = '#FF683F')
    {
        $token = self::getAccessToken();
        $url = "https://api.weixin.qq.com/cgi-bin/message/wxopen/template/send?access_token=$token";
        $data = [
            'touser' => $openid,
            'template_id' => $template_id,
            'page' => $page,
            'color' => $color,
            'form_id' => $form_id,
            'data' => $postData
        ];

        $result = Tools::curl($url, json_encode($data, JSON_FORCE_OBJECT));
        $result = json_decode($result, true);
        if($result['errcode'] !== 0){
            Tools::writeLog("发送模板消息出错：错误码：$result[errcode]；错误消息：$result[errmsg]；formId：{$form_id}；template_id：{$template_id}", "template.txt");
        }
        return $result;
    }

    public static function createQRCode($userId){
        $token = self::getAccessToken();

        $url = "https://api.weixin.qq.com/wxa/getwxacodeunlimit?access_token=".$token;

        $data['scene'] = 'user_id='.$userId;
        $data['width'] = 50;
        $qr_result = Tools::curl($url, json_encode($data));
        $qr_arr = json_decode($qr_result,true);
        if (is_array($qr_arr)){
            Tools::writeLog("获取小程序二维码出错：错误码：$qr_arr[errcode]；错误消息：$qr_arr[errmsg]", "template.txt");
            return false;
        }else{
            if(request()->server("IS_SCF")) {
                $CosUploads = new CosUploads();
                $cos_result = $CosUploads->createCosObject()->putObject(array(
                    'Bucket' => $CosUploads->cosConfig["bucket"],
                    'Key' => $CosUploads->root . 'share/' . $userId . "_" . md5(time()) . ".png",
                    'Body' => $qr_result
                ));

                $address = $cos_result->get("ObjectURL");
                if (!$address) {
                    Tools::writeLog("上传小程序二维码到存储桶错误");
                }
                $info = pathinfo($address);
                //存储图片到数据库
                trResource::add(array(
                    'id' => $info["filename"], 'name' => $info["basename"],
                    'location' => explode('/', request()->path())[0],
                    'url' => $address, "user_id" => $userId, 'time' => time(),
                ));
                $data['url'] = tome_dia($address);
                $data['id'] = $info["filename"];
            }else{
                $save_file = md5($userId . "_" . md5(time()));
                $dir = Env::get("root_path") . "/public/" . config('upload.uploadBase') . request()->mallData["id"] . "/share/";
                Tools::mkdir($dir);
                $file = fopen($dir . $save_file . '.png', "w");//打开文件准备写入
                fwrite($file, $qr_result);//写入
                fclose($file);//关闭
                $data = Tools::saveFileToDatabase($dir . $save_file . '.png', $userId);
            }
            return $data;
        }
    }
}